package com.rice.generator;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.rice.generator.exception.MetaException;
import com.rice.meta.Meta;
import com.rice.meta.Meta.FileConfig;
import com.rice.meta.Meta.FileConfig.FileInfo;
import com.rice.meta.Meta.ModelConfig;
import com.rice.meta.Meta.ModelConfig.ModelInfo;

import java.util.List;

/**
 * 校验元信息
 * @author ricejson
 */
public class ValidateMeta {
    public static void doValidateMeta(Meta meta) {
        // 校验基础信息
        doValidateBasicInfo(meta);
        // 校验文件信息
        doValidateFileInfo(meta);
        // 校验数据模型
        doValidateModelInfo(meta);
    }

    private static void doValidateModelInfo(Meta meta) {
        ModelConfig modelConfig = meta.getModelConfig();
        List<ModelInfo> models = modelConfig.getModels();
        for (ModelInfo modelInfo : models) {
            // 校验字段名称
            String fieldName = modelInfo.getFieldName();
            if (StrUtil.isBlank(fieldName)) {
                throw new MetaException("字段名称不得为空!");
            }
            // 校验字段类型
            String fieldType = modelInfo.getType();
            if (StrUtil.isBlank(fieldType)) {
                modelInfo.setType("Object");
            }
        }
    }

    private static void doValidateFileInfo(Meta meta) {
        FileConfig fileConfig = meta.getFileConfig();
        // 校验输入根路径
        String inputRootPath = fileConfig.getInputRootPath();
        if (StrUtil.isEmpty(inputRootPath)) {
            throw new MetaException("输入根路径不得为空!");
        }
        // 校验输出根路径
        String outputRootPath = fileConfig.getOutputRootPath();
        outputRootPath = StrUtil.emptyToDefault(outputRootPath, "generated");
        fileConfig.setOutputRootPath(outputRootPath);
        // 校验类型
        String type = fileConfig.getType();
        type = StrUtil.emptyToDefault(type, "dir");
        fileConfig.setType(type);
        List<FileInfo> files = fileConfig.getFiles();
        for (FileInfo fileInfo : files) {
            // 校验输入路径
            String inputPath = fileInfo.getInputPath();
            if (StrUtil.isBlank(inputPath)) {
                throw new MetaException("输入路径不得为空!");
            }
            // 校验输出路径
            String outputPath = fileInfo.getOutputPath();
            if (StrUtil.isBlank(outputPath)) {
                throw new MetaException("输出路径不得为空!");
            }
            // 校验文件类型
            String fileType = fileInfo.getType();
            if (StrUtil.isEmpty(fileType)) {
                if (StrUtil.isBlank(FileUtil.getSuffix(inputPath))) {
                    fileInfo.setType("dir");
                } else {
                    fileInfo.setType("file");
                }
            }
            // 校验生成类型
            String generateType = fileInfo.getGenerateType();
            if (StrUtil.isEmpty(generateType)) {
                if (inputPath.endsWith(".ftl")) {
                    fileInfo.setGenerateType("dynamic");
                } else {
                    fileInfo.setGenerateType("static");
                }
            }
        }
    }

    private static void doValidateBasicInfo(Meta meta) {
        // 校验项目名称
        String name = meta.getName();
        if (StrUtil.isEmpty(name)) {
            meta.setName("my-generator");
        }
        // 校验项目描述
        String description = meta.getDescription();
        if (StrUtil.isEmpty(description)) {
            meta.setDescription("我的代码生成器");
        }
        // 校验基础包名
        String basePackage = meta.getBasePackage();
        if (StrUtil.isBlank(basePackage)) {
            throw new MetaException("基础包名不得为空!");
        }
        // 校验版本号
        String version = meta.getVersion();
        if (StrUtil.isEmpty(version)) {
            meta.setVersion("1.0");
        }
        // 校验作者
        String author = meta.getAuthor();
        if (StrUtil.isEmpty(author)) {
            meta.setAuthor("米饭");
        }
        // 校验创建时间
        String createTime = meta.getCreateTime();
        if (StrUtil.isEmpty(createTime)) {
            meta.setCreateTime(DateUtil.now());
        }
    }
}
